#include "functions.h"

/* Vérifie que les arguments passées à une fonction sont correctes,
   retourne :
     0 en cas de succès
     TOO_MANY_ARGS si il y a trop d'arguments
     TOO_FEW_ARGS si il n'y a pas assez d'arguments
     x > 0, si l'argument x n'a pas le bon type (premier qui ne matche pas)
*/
int checkFunctionArgs (struct SType *fparams, struct SType *args) {
    int count = 1 ;
    int res = 0 ;
    int end = 0 ;
    while (!end) {
	end = 1 ;
	/* Si on arriver à la fin des args en même temps, OK. */
	if (fparams == NULL && args == NULL) {
	    res = 0 ;
	}
	/* Si fin des params normals avant fin des args, KO. */
	else if (fparams == NULL) {
	    res = TOO_MANY_ARGS ;
	}
	/* Find es args avant fin des params, KO. */
	else if (args == NULL) {
	    res = TOO_FEW_ARGS ;
	}
	/* Différence entre les types, KO. */
	else if (fparams->ssType != args->ssType) {
	    res = count ;
	}
	else {
	    count ++ ;
	    fparams = fparams->ssNextArg ;
	    args = args->ssNextArg ;
	    end = 0 ;
	}
    }
    return res ;
}

extern const int TYPE_SIZES[] ;

/* Retourne la taille totale nécessaire pour les arguments spécifiés. */
int getFunctionArgsSize (struct SType *fparams) {
    int res = 0 ;
    while (fparams != NULL) {
	res += TYPE_SIZES[fparams->ssType] ;
	fparams = fparams->ssNextArg ;
    }
    return res ;
}
